package com.jxin.mall.member.domain.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.jxin.mall.entity.consts.IntegerConsts;
import com.jxin.mall.member.consts.ServiceLogMsgConsts;
import com.jxin.mall.member.consts.LoginTypeEnum;
import com.jxin.mall.member.domain.dao.LoginHistoryMapper;
import com.jxin.mall.member.domain.entity.LoginHistory;
import com.jxin.mall.member.domain.entity.example.LoginHistoryExample;
import com.jxin.mall.member.domain.exception.LoginHistoryServiceException;
import com.jxin.mall.member.domain.service.LoginHistoryService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * 登入历史服务实现类
 * @author  蔡佳新
 * @version 1.0
 * @since   jdk 1.8
 */
@Service("loginHistoryService")
public class LoginHistoryServiceImpl implements LoginHistoryService {
    @Resource
    private LoginHistoryMapper loginHistoryMapper;
    /**
     * 查看启用的登入历史
     * @param  userId     用户Id
     * @param  loginType  登录类型
     * @throws LoginHistoryServiceException 查询启用登录历史异常时
     * @return 启用的 {@link LoginHistory} 实例,不存在则返回 <code>null</code>
     */
    @Override
    public LoginHistory findEnableLoginHistoryByUserIdAndloginType(Integer userId, Integer loginType) {
        final LoginHistoryExample loginHistoryExample = new LoginHistoryExample();
        loginHistoryExample.createCriteria().andUserIdEqualTo(userId)
                                            .andLoginTypeEqualTo(loginType)
                                            .andEnableEqualTo(true);
        try {
            final List<LoginHistory> loginHistoryList = loginHistoryMapper.selectByExample(loginHistoryExample);
            if(CollectionUtils.isEmpty(loginHistoryList)){
                return null;
            }
            return CollUtil.getFirst(loginHistoryList);
        }catch (Exception e){
            throw new LoginHistoryServiceException(e,
                                                   LoginHistoryServiceMsg.FIND_LOGIN_HISTORY_ERR,
                                                   userId,
                                                   LoginTypeEnum.getNameByType(loginType));
        }
    }
    /**
     * 查看启用的登入历史, 根据token
     * @param  token     令牌
     * @throws LoginHistoryServiceException 查询启用登录历史异常时
     * @return 启用的 {@link LoginHistory} 实例,不存在则返回 <code>null</code>
     */
    @Override
    public LoginHistory getEnableLoginHistoryByToken(String token) {
        final LoginHistoryExample loginHistoryExample = new LoginHistoryExample();
        loginHistoryExample.createCriteria().andTokenEqualTo(token)
                                            .andEnableEqualTo(true);
        try {
            final List<LoginHistory> loginHistoryList = loginHistoryMapper.selectByExample(loginHistoryExample);
            if(CollectionUtils.isEmpty(loginHistoryList)){
                return null;
            }
            return CollUtil.getFirst(loginHistoryList);
        }catch (Exception e){
            throw new LoginHistoryServiceException(e,
                    LoginHistoryServiceMsg.GET_LOGIN_HISTORY_ERR, token);
        }
    }

    /**
     * 根据Id失效指定的登入记录的token
     * @param  loginHistoryId 历史记录Id
     * @throws LoginHistoryServiceException 更新数据库失败
     * @return 如果失效成功则返回 <code>true</code>
     */
    public Boolean disableLoginHistory(Integer loginHistoryId){
        try {
            return  loginHistoryMapper.updateByPrimaryKeySelective(LoginHistory.builder()
                                                                       .loginHistoryId(loginHistoryId)
                                                                       .enable(false)
                                                                       .build()) > IntegerConsts.ZERO;
        } catch (Exception e) {
            throw new LoginHistoryServiceException(e,
                                                   LoginHistoryServiceMsg.DISABLE_LOGIN_HISTORY_ERR,
                                                   loginHistoryId);
        }

    }

    @Override
    public Boolean createLoginHistory(LoginHistory loginHistory) {
        try {
            return loginHistoryMapper.insertSelective(loginHistory) > 0;
        } catch (Exception e) {
            throw new LoginHistoryServiceException(e,
                                                   LoginHistoryServiceMsg.CREAT_LOGIN_HISTORY_ERR,
                                                   JSONUtil.toJsonStr(loginHistory));
        }
    }
    //---------------------------------------------------logMsg---------------------------------------------------------
    /**
     * 日志信息常量的内部类
     * @author 蔡佳新
     * @version 1.0
     */
    private interface LoginHistoryServiceMsg{
        String FIND_LOGIN_HISTORY_ERR = ServiceLogMsgConsts.LOGIN_HISTORY_SERVICE + "查询用户启用登录记录,查数据库异常。userId:{}, loginType:{}";
        String GET_LOGIN_HISTORY_ERR = ServiceLogMsgConsts.LOGIN_HISTORY_SERVICE + "查询用户启用登录记录,查数据库异常。token:{}";
        String DISABLE_LOGIN_HISTORY_ERR = ServiceLogMsgConsts.LOGIN_HISTORY_SERVICE + "失效登录记录,更新数据库异常。loginHistoryId:{}";
        String CREAT_LOGIN_HISTORY_ERR = ServiceLogMsgConsts.LOGIN_HISTORY_SERVICE + "创建登录记录,插入数据库异常。loginHistory实例:{}";
    }
}
